package com.sxj.corejava.code08_常用类.String;

/**
 * @author 石小俊
 * @date 2024年04月13日 9:16
 */
public class Test11_常量池 {

    public static void main(String[] args) {
        String s = new String("admin");
        String s2 = new String("admin");
        s = new String("alice");

        String s3 = "admin";
        s3 = "alice";
        String s4 = "admin";

        String s5 = new String("admin");
        System.out.println(s2 == s5);

        String s6 = "admin";
        System.out.println(s4 == s6);

        String s7 = "a";
        String s8 = "aa";
        String s9 = "aaa";
        String s10 = s7 + s8;
        // 此时的s10不是字符常量,即:不是存储在常量池中的
        // 其值是运行时确定的,而不是通过双引号给的
        // 当运行前不确定的值是不会被存储到常量池中的
        // 因此,s10是存储在堆中
        // 堆中的数据的地址与常量池中数据的地址一定是不等的
        System.out.println(s9 == s10);  // false
        // s11在运行时可以确定其是存储到常量池中的,因此直接比较值的大小
        // 因此,相同数据的地址也是相同的
        // 如何区分数据存储位置:
        // 1.直接定义值的时候,如果直接写双引号,则存储到常量池中,否则存储到堆中
        // 2.运算时,如果运算过程中所有数据都能在运行时确定其是存储到常量池中的
            // 即:运算过程中涉及的所有数据是否都是字符常量
            // 则当前运算结果也是常量池
            // 否则存储到堆中
        String s11 = "a" + "aa";
        System.out.println(s11 == s9); // true

        String s12 = "a" + s8;
        System.out.println(s9 == s12);
    }

}
